import axios from 'axios';
import { encrypt, decrypt } from './cryptoService';
import config from '../config';

// 创建axios实例
const service = axios.create({
  // 根据环境决定是否使用代理
  // 开发环境：使用代理地址'/api'，通过vite的proxy配置转发请求
  // 生产环境：直接使用实际API地址
  baseURL: config.useMock ? '' : (config.useProxy ? '/api' : config.apiBaseURL),
  timeout: 10000, // 请求超时时间
});



// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么，比如添加token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }

    // 对请求数据进行加密 - 与Python测试代码兼容
    if (config.method === 'post' || config.method === 'put') {
      if (config.data) {
        // 记录原始数据用于调试
        config._originalData = JSON.stringify(config.data);
        // 按照Python测试代码的方式加密数据
        // 先将数据转为JSON字符串，然后加密
        const jsonStr = JSON.stringify(config.data);
        const encryptedData = encrypt(jsonStr);
        // 直接发送加密后的数据，不包装在对象中
        config.data = encryptedData;
      }
    } else if (config.params) {
      // 对GET请求参数不加密，因为Python测试代码中GET请求使用headers传递token
      config._originalParams = JSON.stringify(config.params);
    }

    return config;
  },
  (error) => {
    // 对请求错误做些什么
    console.error('请求错误:', error);
    return Promise.reject(error);
  },
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 获取响应数据 - 假设所有响应都是加密的
    const encryptedData = response.data;
    let decryptedData;
    let res;

    try {
      // 解密数据 - 与Python测试代码兼容
      decryptedData = decrypt(encryptedData);

      // 尝试解析JSON
      try {
        res = JSON.parse(decryptedData);
      } catch {
        // 如果不是JSON，直接使用解密后的字符串
        res = { data: decryptedData };
      }
    } catch (error) {
      console.error('响应数据解密失败:', error);
      // 如果解密失败，尝试直接使用原始响应
      res = encryptedData;
    }

    // 如果返回的状态码不是200，说明接口请求有误
    if (res.code !== 200 && res.code !== undefined) {
      console.error('接口请求错误:', res.message || '未知错误');
      // 根据不同的错误码做不同的处理
      if (res.code === 401) {
        // 未登录或token过期，清除token并跳转到登录页
        localStorage.removeItem('token');
        localStorage.removeItem('userInfo');
        window.location.href = '/#/login';
      }
      return Promise.reject(res || 'Error');
    } else {
      // 保存原始加密数据和解密后的数据，以便调试
      res._encryptedData = encryptedData;
      res._decryptedData = decryptedData;
      return res;
    }
  },
  (error) => {
    console.error('响应错误:', error);
    return Promise.reject(error);
  },
);

// 封装GET请求
export function get(url, params) {
  return service({
    url,
    method: 'get',
    params,
  });
}

// 封装POST请求
export function post(url, data) {
  return service({
    url,
    method: 'post',
    data,
  });
}

// 封装PUT请求
export function put(url, data) {
  return service({
    url,
    method: 'put',
    data,
  });
}

// 封装DELETE请求
export function del(url, params) {
  return service({
    url,
    method: 'delete',
    params,
  });
}

export default service;
